package com.qf.fcy.youshare.view;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.GridView;
import com.qf.fcy.youshare.Constants;

/**
 * 自定义GridView，解决ScrollView中嵌套GridView显示不正常的问题（1行半）
 * GridView或者ListView的优化可能会失败
 */
public class FullGridView extends GridView {

    public FullGridView(Context context) {
        super(context);
    }

    /**
     * 如果要再XML中使用该自定义View，那么必须实现该方法
     *
     * @param context
     * @param attrs
     */
    public FullGridView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public FullGridView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    /**
     * 对于在 ScrollView中的GridView, 我们需要重写这个方法
     * 问一下子空间的大小，这个时候，子空间就要算一下自己到底有多大，
     * 然后返回给父容器。当子空间，或者子容器计算自己有多大的时候，会回调该方法
     * 这个方法内部必须设置自身的尺寸，这样父容器才知道有都大
     *
     * @param widthMeasureSpec  宽度尺寸规格，宽度包含父容器允许空间最大有多款
     * @param heightMeasureSpec 高度尺寸规格，高度规格里包含了父容器允许孔家有多高，
     *                          同时还有是 wrap_content 还是确切的数值
     */
    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//        // 获取宽度规格中的宽度数值
//        int wSize = MeasureSpec.getSize(widthMeasureSpec);
//        int wMode = MeasureSpec.getMode((widthMeasureSpec));
//
//        // 获取宽度规格中的宽度数值
//        int hSize = MeasureSpec.getSize(widthMeasureSpec);
//        int hMode = MeasureSpec.getMode((widthMeasureSpec));
//
//        // wSize, hSize 就是父容器给当前控件提供的最大的控件
//        //              或者就是在layout文件中，我们指定的数值尺寸，如200dp
//        //              实际获取的数组，单位是像素，如果布局采用dp，单位
//        //              那么此处获取到的像素和布局写的数值可能会不同
//        Log.d(Constants.TAG, "wSize=" + wSize);
//        Log.d(Constants.TAG, "hSize=" + hSize);
//
//        // mode 代表了 尺寸计算的方式
//        // MeasureSpec 里面提供了尺寸计算模式的常量定义
//        switch (hMode) {
//            case MeasureSpec.AT_MOST:
//                break;
//            case MeasureSpec.EXACTLY:
//                break;
//            case MeasureSpec.UNSPECIFIED:
//                break;
//        }

        // 如果我们能够把高度 hSize 设置一个很大的值，并且将尺寸计算模式，调整为AT_MOST(wrap_content)
        // 那么GridView将能够完全显示
        int expandSpec = MeasureSpec.makeMeasureSpec(
                Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}
